#include<stdio.h>

#include<stdlib.h> // 堆管理

// 五大内存分区

// 栈

// 文字常量区

// 代码段

// 静态全局区：静态变量和全局变量

// 堆：申请和销毁都是由用户自定义的


// void func()
// {
//     static int a = 10;
// }


// int* func()
// {
//     int a[10] = {0};
//     return a;//a是局部变量，出了函数就没了
// }









// int main()
// {
//     //malloc:申请一块堆上空间
//     // malloc可能申请空间失败，如果失败，返回空指针NULL
//     // int* a = (int *)malloc(sizeof(int));
   
//     // if(a == NULL)
//     // {
//     //     printf("堆山空间申请失败!\n");
//     //     return -1;
//     // }
    
//     // *a = 10;
//     // printf("%d\n",*a);

//     // //内存泄漏：堆上空间只申请不释放 
//     // free(a); //释放内存
    
//     // int *a = (int*)malloc(sizeof(int) * 10);
//     //     if(a == NULL)
//     //     {
//     //     printf("堆山空间申请失败!\n");
//     //     return -1;
//     //     }
//     // for(int i=0;i<10;i++)
//     // {
//     //     a[i]=i+1;   
//     // }
//     // for(int i=0;i<10;i++)
    
//     // {printf("%d ",a[i]);}
    
//     // printf("\n");
    
//     // free(a);
    
//     // int** a = (int**)malloc(sizeof(int*) * 2 );

//     // if(a == NULL)
//     // {
//     // printf("堆山空间申请失败!\n");
//     // return -1;
//     // }
    
//     // for(int i=0;i<2;i++)
//     // {
//     //     a[i] = (int*)malloc(sizeof(int) * 3);
//     // }


//     // for( int i = 0 ; i < 2 ; i++ )
//     // {
//     //     for( int j = 0 ; j < 3 ; j++ )
//     //     {
//     //         a[i][j]= i * 2 + j ;
//     //         printf("%d ",a[i][j]);
//     //     }
//     //     printf("\n");
//     // }
    
//     // for(int i=0;i<2;i++)
//     // {
//     //     free(a[i]);
//     // }

//     // free(a);



//     //  会将申请的每一块内存初始化为0    更适合申请普通类型的数组

//     //malloc 是申请一大块内存

//     //calloc 是申请 多少个 什么样的内存  知道每个的大小所以可以初始化


//     int* a = (int* )calloc( 10 , sizeof(int) );
//     if( a == NULL )
//     {
//         printf("calloc申请空间失败\n");
//         return -1;
//     }

//     for(int i=0;i< 10;i++)
//     {
//         a[i]= i+1;
//         printf("%d ",a[i]);
//     }
//     printf("\n");
    
//     // free(a);


//     //重新申请内存
//     //扩容函数：将原本指向的堆上空间进行扩容

//     //1.原地扩容：原指针仍然可以使用
//     //2.重新申请空间：原指针内存被释放，原指针失效
    
//     //默认规定：不去使用原指针，直接用新的

//     // 释放内存时，直接释放新指针就行了
    
//     int *p = realloc(a,sizeof(int*) * 20);
    
//     for(int i=0;i< 10;i++)
//     {
//         a[i]= i+1;
//         printf("%d ",p[i]);
//     }
//     printf("\n");
//     return 0;
// }